package br.com.websec.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.event.FileUploadEvent;

import br.com.websec.boleto.GeraBoleto;
import br.com.websec.cnab.GeraRemessaCNAB;
import br.com.websec.conta.Conta;
import br.com.websec.conta.ContaRN;
import br.com.websec.endereco.Endereco;
import br.com.websec.endereco.EnderecoRN;
import br.com.websec.fornecedor.Fornecedor;
import br.com.websec.fornecedor.FornecedorRN;
import br.com.websec.titulo.Titulo;
import br.com.websec.titulo.TituloRN;
import br.com.websec.usuario.Usuario;
import br.com.websec.util.ContextoUtil;
import br.com.websec.util.CpfCnpjUtil;
import br.com.websec.util.UtilException;
import br.com.websec.xml.RecuperaRemessaXML;
import br.com.websec.xml.RemessaXML;
import br.com.websec.xml.TituloXML;

@ManagedBean(name = "fornecedorBean")
@RequestScoped
public class FornecedorBean {

	private List<Titulo> listaTitulos = new ArrayList<Titulo>();
	private List<Conta> listaConta = new ArrayList<Conta>();
	private Fornecedor fornecedor = new Fornecedor();
	private Endereco endereco = new Endereco();
	private Conta conta = new Conta();
	private String totalDiasVencido;
	private String agencia;
	private String banco;
	private String numero;
	private Integer duplicataEnviadas;
	private Integer duplicataRecebidas;
	private Integer duplicataPagas;
	private Integer duplicataVencer;
	private Integer duplicataVencidas;
	private Integer duplicataVencidasPeriodo;
	private String senha;
	private String confirmaSenha;
	private Date dataVencimento;
	private List<Titulo> titulos;
	private Titulo titulo;
	private Integer tituloSelecionado=1;

	public String novo() {
		return "cadastro";
	}

	public String salvar() {

		FacesContext context = FacesContext.getCurrentInstance();

		if (senha != null && senha.trim().length() > 0
				&& !senha.equals(this.confirmaSenha)) {

			FacesMessage facesMessage = new FacesMessage(
					"A senha não foi confirmada corretamente");
			context.addMessage(null, facesMessage);

			return null;
		}

		if (validaCNPJ(this.fornecedor.getCnpj())) {
			salvaEnderecoFornecedor();
			return "/publico/bemvindo.xhtml";

		} else {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"CNPJ Inválido", "CPF Inválido informe um cpf válido.");
			context.addMessage(null, msg);
			return null;

		}

	}

	public void salvaEnderecoFornecedor() {

		FornecedorRN fornecedorRN = new FornecedorRN();
		EnderecoRN enderecoRN = new EnderecoRN();
		this.endereco.setNumero(Integer.parseInt(this.numero));
		this.endereco.setFornecedor(this.fornecedor);
		fornecedorRN.salvarFornecedor(fornecedor, senha);
		enderecoRN.salvarEndereco(this.endereco);
	}

	public void cancelar() {

		this.fornecedor = null;
		this.endereco = null;

	}

	public boolean validaCNPJ(String cnpj) {
		CpfCnpjUtil validaCnpj = new CpfCnpjUtil();
		fornecedor.setCnpj(validaCnpj.noFormatCNPJ(cnpj));

		String novoCnpj = validaCnpj.noFormatCNPJ(cnpj);
		if (validaCnpj.isValidCNPJ(novoCnpj)) {
			return true;

		}
		return false;
	}

	public void upload(FileUploadEvent event) {
		FornecedorRN fornecedorRN = new FornecedorRN();
		fornecedorRN.enviarArquivo(event);
	}

	public List<Titulo> consultarTituloPorVencimento() {
		this.listaTitulos = new ArrayList<Titulo>();
		TituloRN tRN = new TituloRN();
		listaTitulos = tRN.listar();
		return listaTitulos;
	}

	public void consultarPorDiasVencidos() {

		if (this.totalDiasVencido != null && !totalDiasVencido.equals("")) {
			this.listaTitulos = new ArrayList<Titulo>();
			TituloRN tRN = new TituloRN();
			listaTitulos = tRN.consultarPorDiasVencidos(Integer.parseInt(this.totalDiasVencido));
			
		}
		
		FacesContext context = FacesContext.getCurrentInstance();
		FacesMessage facesMessage = new FacesMessage("Selecione um período para consulta");
		context.addMessage(null, facesMessage);
		return ;
		

	}
	
//	public void gerarCnab() throws UtilException{
//		
//		GeraRemessaCNAB cnab = new GeraRemessaCNAB();
//		
//		List<Titulo> lista = new ArrayList<Titulo>(); 
//		lista = cnab.titulo(1);
//		try {
//			cnab.gerarArquivoCnab(lista, 1);
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		
//	}
	
	public void gerarBoelto() throws UtilException{
		
		GeraBoleto boleto = new GeraBoleto();
		boleto.gerarBoleto(tituloSelecionado);
		
	}
	
	
	public void importarXML(){
		
		RemessaXML r = RecuperaRemessaXML.lerXml();
		TituloXML tXML = new TituloXML();
		
		FacesContext context = FacesContext.getCurrentInstance();
		
		try{
			tXML.populaTituloXML(r);
		}
		catch(Exception ex){
			
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"Erro ao localizar Banco", "Banco não suportado ou nulo.");
			context.addMessage(null, msg);
		}
	}

	
	public void contaSelecionada(AjaxBehaviorEvent event) {

		if (this.conta != null) {
			this.agencia = String.valueOf(conta.getAgencia().getNumero());
			this.agencia += "-" + conta.getAgencia().getDigito();
			this.banco = conta.getAgencia().getBanco().getNomeBanco();
		}

	}

	public List<Conta> getListaConta() {
		ContaRN contaRN = new ContaRN();
		this.listaConta = new ArrayList<Conta>();
		listaConta = contaRN.listarConta();
		return listaConta;
	}
	
	public List<Titulo> listarTitulos(){

		List <Titulo> listaTitulo = new ArrayList<Titulo>();
		TituloRN tRN = new TituloRN();
		listaTitulo = tRN.buscarPorDataVencimento(dataVencimento);
		this.titulos = listaTitulo; 
		
		return titulos;
	}
	
	public Usuario getUsuarioLogado(){
		ContextoBean contexto = ContextoUtil.getContextoBean();
		Usuario u = contexto.getUsuarioLogado();
		return u;
	}
	
	public Date getDataVencimento() {
		return this.dataVencimento;
	}

	public void setDataVencimento(Date dataVencimento) {
		this.dataVencimento = dataVencimento;
	}
	
	public String getTotalDiasVencido() {
		return this.totalDiasVencido;
	}

	public void setTotalDiasVencido(String totalDiasVencido) {
		this.totalDiasVencido = totalDiasVencido;
	}

	public List<Titulo> getListaTitulos() {
		return listaTitulos;
	}

	public void setListaTitulos(List<Titulo> listaTitulos) {
		this.listaTitulos = listaTitulos;
	}

	public Integer getDuplicataEnviadas() {
		return duplicataEnviadas;
	}

	public void setDuplicataEnviadas(Integer duplicataEnviadas) {
		this.duplicataEnviadas = duplicataEnviadas;
	}

	public Integer getDuplicataRecebidas() {
		return duplicataRecebidas;
	}

	public void setDuplicataRecebidas(Integer duplicataRecebidas) {
		this.duplicataRecebidas = duplicataRecebidas;
	}

	public Integer getDuplicataPagas() {
		return duplicataPagas;
	}

	public void setDuplicataPagas(Integer duplicataPagas) {
		this.duplicataPagas = duplicataPagas;
	}

	public Integer getDuplicataVencer() {
		return duplicataVencer;
	}

	public void setDuplicataVencer(Integer duplicataVencer) {
		this.duplicataVencer = duplicataVencer;
	}

	public Integer getDuplicataVencidas() {
		return duplicataVencidas;
	}

	public void setDuplicataVencidas(Integer duplicataVencidas) {
		this.duplicataVencidas = duplicataVencidas;
	}

	public Integer getDuplicataVencidasPeriodo() {
		return duplicataVencidasPeriodo;
	}

	public void setDuplicataVencidasPeriodo(Integer duplicataVencidasPeriodo) {
		this.duplicataVencidasPeriodo = duplicataVencidasPeriodo;
	}

	public Fornecedor getFornecedor() {
		return this.fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	public Endereco getEndereco() {
		return this.endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public String getNumero() {
		return this.numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getConfirmaSenha() {
		return this.confirmaSenha;
	}

	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}


	public void setListaConta(List<Conta> listaConta) {
		this.listaConta = listaConta;
	}

	public Conta getConta() {
		return this.conta;
	}

	public void setConta(Conta conta) {
		this.conta = conta;
	}

	public String getAgencia() {
		return this.agencia;
	}

	public void setAgencia(String agencia) {
		this.agencia = agencia;
	}

	public String getBanco() {
		return this.banco;
	}

	public void setBanco(String banco) {
		this.banco = banco;
	}

	public Titulo getTitulo() {
		return titulo;
	}

	public void setTitulo(Titulo titulo) {
		this.titulo = titulo;
	}

	public List<Titulo> getTitulos() {
		return titulos;
	}

	
	public Integer getTituloSelecionado() {
		return tituloSelecionado;
	}

	public void setTituloSelecionado(Integer tituloSelecionado) {
		this.tituloSelecionado = tituloSelecionado;
	}

	public void setTitulos(List<Titulo> titulos) {
		this.titulos = titulos;
	}

}
